#ifndef SILHOUETTE_H_
#define SILHOUETTE_H_

//TODO limpiar

#include "Filter.h"
#include <complex>
#include <iostream>
#include <string>
#include "FilterException.h"
#include "..\\VectorFourier.h"

#include <cv.h>
#include <math.h>
#include <fstream>
#include <sstream>
#include <cmath>

#include "..\BaseDeDatos.h"
#include "..\VectorFourier.h"

using namespace std;
using namespace cv;

class SilhouetteFilter : public Filter
{

private:
	vector<cv::Point> MatrizContorno;

	//use esta opcion para poder utilizar el algoritmo sort y poder contar con el punto central
	static cv::Point punto_central;
	
	//bool (SilhouetteFilter::* foo)(const cv::Point,const cv::Point);

	string nombre_archivo;
	BaseDeDatos* bd;

	multimap<float,string> soluciones;
	VectorFourier vector_actual;
	bool agregar_bd;
	int min_x;

public:
	int DetectarFrontera();
	bool EsPuntoContorno(const cv::Point &p, const cv::Mat &Mat, const vector<cv::Point> &matriz);
	vector<cv::Point> ObtenerPuntosContorno(const cv::Mat &Mat);
	vector<cv::Point> ObtenerPuntosContorno_fast(const cv::Mat &Mat);
	void DibujarPuntos(vector<cv::Point> puntos, cv::Mat &Mat);
	cv::Point ObtenerCentroImagen(const vector<cv::Point> puntos);
	static bool esAnterior(const cv::Point a,const cv::Point b);
	static bool esAnterior2(const cv::Point a,const cv::Point b);
	vector<cv::Point> ObtenerPerfilIzquierdo(const vector<cv::Point> puntos,const cv::Point centro);	
	string AplicarFourier(vector<cv::Point> puntos);
	void InicializarMatrizContorno();
	void AlmacenarVector();
	vector<cv::Point> NormalizarContorno(vector<cv::Point> puntos,const cv::Point centro);

	SilhouetteFilter(string nombre_archivo, bool agregar_bd,int dist_pivote);
	virtual ~SilhouetteFilter(){};

	virtual void process(const cv::Mat &src, cv::Mat &dst);
};

#endif
